package br.com.virtual.base.controller.cadastro;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.virtual.base.controller.util.VirtualMB;
import br.com.virtual.base.enums.TipoEnderecoEnum;
import br.com.virtual.base.exceptions.VirtualValidationException;
import br.com.virtual.base.service.AutenticacaoService;
import br.com.virtual.base.uteis.EnderecoDataModel;
import br.com.virtual.cadastrar.model.Endereco;
import br.com.virtual.cadastrar.model.Usuario;
import br.com.virtual.cadastrar.service.EnderecoService;

@ManagedBean
@ViewScoped
public class EnderecoMB extends VirtualMB {

	private static final long serialVersionUID = 1L;
	private EnderecoDataModel enderecosDataModel;
	private List<Endereco> enderecos;
	private Endereco endereco;
	private Usuario usuario;

	@EJB
	private AutenticacaoService autenticacaoService;
	@EJB
	private EnderecoService enderecoService;

	@PostConstruct
	private void init() {

		this.linkRetorno = (String) this.getFlash("retorno");

		if (this.autenticacaoService.hasUsuarioAutenticado())
			this.usuario = this.autenticacaoService.usuarioAutenticado();

		if (this.usuario == null)
			this.autenticacaoService.redirectToLogin();

		this.novo();
	}

	public void novo() {

		this.enderecos = null;
		this.enderecosDataModel = null;
		this.endereco = new Endereco();
		this.endereco.setTipoEndereco(TipoEnderecoEnum.ENTREGA);
		this.endereco.setPessoa(this.usuario.getPessoa());

	}

	public String gravar() {

		String paginaRetorno = (String)getSession("paginaRetorno");
		setSession("paginaRetorno", null);
		
		try {
			if (this.endereco.getId() == null) {
				this.enderecoService.create(this.endereco);
				this.addFacesMessage("Endereço cadastrado com sucesso.",
						FacesMessage.SEVERITY_INFO, null);
			} else {
				this.enderecoService.update(this.endereco);
				this.addFacesMessage("Endereço atualizado com sucesso.",
						FacesMessage.SEVERITY_INFO, null);
			}
			this.novo();
		} catch (VirtualValidationException e) {
			e.printStackTrace();
		}
		
		return paginaRetorno;
	}

	public String voltar() {
		return this.linkRetorno;
	}

	public void excluir() {

		try {

			if (this.endereco.getTipoEndereco().equals(TipoEnderecoEnum.PRINCIPAL)) {

				this.addFacesMessage(
						"Seu endereço principal não pode ser excluido, apenas alterado.",
						FacesMessage.SEVERITY_ERROR, null);
			} else {
				this.enderecoService.delete(endereco);

				this.addFacesMessage("Endereço excluido com sucesso.",
						FacesMessage.SEVERITY_INFO, null);
			}
			this.novo();
		} catch (VirtualValidationException e) {
			e.printStackTrace();
		}

	}

	private List<Endereco> findEnderecosPessoa() {

		return this.enderecoService.getList(this.usuario.getPessoa());
	}

	/*
	 * GETTERS AND SETTERS
	 */

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public EnderecoDataModel getEnderecosDataModel() {
		if (this.enderecosDataModel == null)
			this.enderecosDataModel = new EnderecoDataModel(getEnderecos());
		return enderecosDataModel;
	}

	public void setEnderecosDataModel(EnderecoDataModel enderecosDataModel) {
		this.enderecosDataModel = enderecosDataModel;
	}

	public List<Endereco> getEnderecos() {
		if (enderecos == null)
			this.enderecos = this.findEnderecosPessoa();
		return enderecos;
	}

	public void setEnderecos(List<Endereco> enderecos) {
		this.enderecos = enderecos;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

}
